package add_$21_genericity;

import java.util.Arrays;

/*
<T extends Comparable>会提醒你Comparable is a raw type.
References to generic type Comparable<T> should be parameterized
翻译过来就是：Comparable是一个原始类型。对泛型Comparable<T>的引用应该参数化
转换为泛型参数化的方式是修改原始类型为具体类型，即将Comparable更改为Comparable<T>，
其中T是类型参数。例如：<T extends Comparable<T>>。
这样，编译器就能够确切地推断出Comparable接口所使用的类型，并进行类型检查
Comparable<T>是一个泛型接口，表示可以进行比较的类型。通过实现Comparable接口，我们可以定义自定义类型的比较方式。
<? super T> 是一个通配符泛型，表示T或T的父类，这样做的目的是为了更大的灵活性。
比如，如果T是一个子类类型，<? super T>可以使得T的父类也可以作为Comparable接口的类型参数。

 */
public class ClassGenericity<T extends Comparable<? super T>> {
    
    public T[] bubbleSort(T[] arr) {
        for (int i = 0; i < arr.length - 1; i++) {
            for (int j = 0; j < arr.length - i - 1; j++) {
                if (arr[j].compareTo(arr[j+1]) > 0) {
                    T temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
        }
        return arr;
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        ClassGenericity<Integer> cg = new ClassGenericity<Integer>();
        Integer[] arr = {4, 1, 3, 4, 2, 5};
        System.out.println(Arrays.toString(cg.bubbleSort(arr)));
    }

}
